package com.example.demo.service.imp;


import com.example.demo.contrller.data.ReturnData;
import com.example.demo.contrller.vo.RegisterUser;
import com.example.demo.dao.UserDao;
import com.example.demo.demos.User;
import com.example.demo.service.MyAsyncService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import com.example.demo.utils.TokenUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.concurrent.TimeUnit;
@Service
public class UserServicelmp implements UserService {
    @Autowired
    UserDao userDao;
    @Resource
    RedisTemplate redisTemplate;

    @Override
    public ReturnData getUser(String token){

        try {
            String userrname = TokenUtils.getUsernameByToken(token);
            User user=userDao.findByUsername(userrname).get(0);
            return ReturnData.ok("获取成功", user);
        }catch (NoSuchElementException e){
            return ReturnData.error("没有这个用户");
        }
    }
    //登录的接口业务处理
    @Override
    public ReturnData login(String user, String pwd) {
        //调用数据库操作类，查找对应表里有没有数据匹配
        List<User> users = userDao.findByUsernameAndPassword(user, pwd);
        if(users.size()>0){//如果有，登陆成功
            HashMap<String, Object> map = new HashMap<>();
            map.put("token", TokenUtils.getToken(users.get(0).getUsername()));
            users.get(0).setPassword("");
            map.put("userInfo",users.get(0));
            redisTemplate.opsForValue().set(users.get(0).getUsername(),users.get(0));//写进缓存
//            redisTemplate.opsForValue().get(users.get(0).getUsername());//读缓存
            return ReturnData.ok("登陆成功",map);
        }else {//查找不到对应的用户数据
            return ReturnData.error("登录失败");//返回空，此时要在前端提示登录失败
        }
    }

    @Resource
    MyAsyncService myAsyncService;

    //登陆接口
    @GetMapping("getCode")
    public ReturnData getCode(String email)  {
//        1.先生成一个随机验证码；
//        2.把这个验证码存起来，可以存到redis缓存，也可以存到数据库
//        3.把验证码发给对应的邮箱
//        4.返回发送成功的结果
//        5.返回给前端，告诉前端验证码已发送到手机或者邮箱，请注意查收
//        Long satrt = System.currentTimeMillis();
        //0到899999 new Random().nextInt(899999)
        int code = new Random().nextInt(899999)+100000;//100000
        System.out.println(code);
        redisTemplate.opsForValue().set(email,code,3, TimeUnit.MINUTES);//设置缓存时间为3分
//        Thread.sleep(2000);//延时2秒执行后面的代码，模拟发邮件给email耗时
        myAsyncService.sendSms(email,code);
        return ReturnData.ok("验证码已发送到手机或者邮箱，请注意查收","");

    }
    @Override
    public ReturnData register(RegisterUser user){
        if(user.getEmail()==null||user.getEmail().equals("")){
            return ReturnData.error("请输入邮箱") ;
        }
        if(user.getPassword()==null||user.getPassword().equals("")){
            return ReturnData.error("请输入密码") ;
        }
        if(user.getUsername()==null||user.getUsername().equals("")){
            return ReturnData.error("请输入用户名") ;
        }
        if(user.getCode()==null||user.getCode().equals("")){
            return ReturnData.error("请输入验证码");
        }

        int codeRedis =0;
        try{
            codeRedis = (int) redisTemplate.opsForValue().get(user.getEmail());//从缓存中拿验证码
        }catch (NoSuchElementException exception){
            return ReturnData.error("验证码已过期") ;
        }
        if(!user.getCode().equals(codeRedis+"")){//判断前段传过来的验证码和缓存中的验证码是不是一致
            return ReturnData.error("验证码错误") ;
        }
        List<User> list = userDao.findByUsername(user.getUsername());
        if(list.size()>0){//如果查出来的结果长度大于0，表明存在这个用户名
            return ReturnData.error("该用户名已注册");
        }
        list = userDao.findByEmail(user.getEmail());
        if (list.size() > 0) {//如果查出来的结果长度大于0，表明存在这个邮箱的用户
            return ReturnData.error("该邮箱已注册");
        }
        User userObj = new User();
        userObj.setUsername(user.getUsername());
        userObj.setPassword(user.getPassword());
        userObj.setEmail(user.getEmail());
        userObj.setRegister_date(new Timestamp(System.currentTimeMillis()));
        userDao.save(userObj);//保存
        return ReturnData.ok("注册成功，请前往登录","");
    }

    @Override
    public ReturnData updateUserInfo(RegisterUser registerUser, String token) {
        String userrname = TokenUtils.getUsernameByToken(token);
        User user=userDao.findByUsername(userrname).get(0);

        if(!StringUtils.hasText(registerUser.getNickname())){
            return ReturnData.error("请输入昵称") ;
        }
        if(!StringUtils.hasText(registerUser.getPhone())){
            return ReturnData.error("请输入昵称") ;
        }
        if(!StringUtils.hasText(registerUser.getSgin())){
            return ReturnData.error("请输入昵称") ;
        }
            if(registerUser.getSex()==0){
                return ReturnData.error("请输入昵称") ;
            }
        if(!StringUtils.hasText(registerUser.getAvatar())){
            return ReturnData.error("请输入昵称") ;
        }
        user.setNickname(registerUser.getNickname());
        user.setPhone(registerUser.getPhone());
        user.setSgin(registerUser.getSgin());
        user.setSex(registerUser.getSex());
        user.setAvatar(registerUser.getAvatar());
        userDao.save(user);//改完存回数据库
        return ReturnData.ok("修改成功");
    }

}
